/**
 * huize Service Inc
 * All Rights Reserved @2018
 */
package com.huize.ladon.apm.common.enums;

import org.apache.commons.lang3.StringUtils;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 描述: 日期类型 枚举
 *
 * @author tianyuliang
 * @version $Id: DateTypeEnum.java, v0.1 2021/2/3
 */
public enum DateTypeEnum implements EnumInterface {

    /**
     * 未知
     */
    UNKNOWN("unknown", "unknown", "未知"),

    /**
     * 当日
     */
    CURRENT_DAY("day", "current_day", "当日"),

    /**
     * 月累计
     */
    MONTH_TOTAL("month", "current_month", "月累计"),

    /**
     * 季度累计
     */
    QUARTER_TOTAL("quarter", "current_quarter", "季度累计"),

    /**
     * 近60天
     */
    SIXTY("sixty", "", "近60天"),

    /**
     * 近180天（半年）
     */
    HALF_YEAR("half_year", "", "近180天"),

    /**
     * 年累计
     */
    YEAR_TOTAL("year", "current_year", "年累计"),

    /**
     * 全累计
     */
    TOTAL("total", "current_total", "全累计"),
    ;

    private String type;

    private String sortFieldName;

    private String desc;

    DateTypeEnum(String type, String sortFieldName, String desc) {
        this.type = type;
        this.sortFieldName = sortFieldName;
        this.desc = desc;
    }

    public static DateTypeEnum of(String code) {
        if (StringUtils.isEmpty(code)) {
            return UNKNOWN;
        }

        return Stream.of(values()).filter(b -> b.getCode().equalsIgnoreCase(code.trim())).findFirst().orElseGet(() -> UNKNOWN);
    }

    /**
     * 校验是否有效 true:有效, false:无效
     */
    public static boolean checkValidType(String type) {
        DateTypeEnum typeEnum = of(type);
        return typeEnum != UNKNOWN;
    }

    /**
     * 校验是否有效 true:有效, false:无效
     */
    public static boolean checkValidType(DateTypeEnum typeEnum) {
        return typeEnum != UNKNOWN;
    }

    /**
     * 构建公共类型
     */
    public static List<DateTypeEnum> buildMonthYearType() {
        return Stream.of(MONTH_TOTAL, YEAR_TOTAL).collect(Collectors.toList());
    }

    /**
     * 校验是否为 当日
     */
    public static boolean isDay(DateTypeEnum typeEnum) {
        return typeEnum == CURRENT_DAY;
    }

    /**
     * 校验是否为 日累计
     */
    public static boolean isDay(String type) {
        return of(type) == CURRENT_DAY;
    }

    /**
     * 校验是否为 月累计
     */
    public static boolean isMonth(DateTypeEnum typeEnum) {
        return typeEnum == MONTH_TOTAL;
    }

    /**
     * 校验是否为 180天
     */
    public static boolean isHalfYear(DateTypeEnum typeEnum) {
        return typeEnum == HALF_YEAR;
    }

    /**
     * 校验是否为 60天
     */
    public static boolean isSixty(DateTypeEnum typeEnum) {
        return typeEnum == SIXTY;
    }

    /**
     * 校验是否为 月累计
     */
    public static boolean isMonth(String type) {
        return of(type) == MONTH_TOTAL;
    }

    /**
     * 校验是否为 年累计
     */
    public static boolean isYear(DateTypeEnum typeEnum) {
        return typeEnum == YEAR_TOTAL;
    }

    /**
     * 校验是否为 年累计
     */
    public static boolean isYear(String type) {
        return of(type) == YEAR_TOTAL;
    }


    public String getType() {
        return type;
    }

    @Override
    public String getCode() {
        return type;
    }

    @Override
    public String getDesc() {
        return desc;
    }

    @Override
    public String toString() {
        return String.format("[%s,%s]", getCode(), getDesc());
    }

}